/**
 * Markdown 图片处理工具
 * 用于检测、上传和替换 Markdown 中的本地图片
 */

/**
 * 从 Markdown 内容中提取所有图片引用
 * @param {string} markdown - Markdown 内容
 * @returns {Array<Object>} 图片信息数组 [{ alt, path, isLocal, index }]
 */
export function extractImages(markdown) {
  if (!markdown) return []

  const images = []
  // 匹配 Markdown 图片语法：![alt](path)
  const imageRegex = /!\[([^\]]*)\]\(([^)]+)\)/g
  let match

  while ((match = imageRegex.exec(markdown)) !== null) {
    const alt = match[1] || ''
    const path = match[2].trim()

    images.push({
      alt,           // 图片描述
      path,          // 图片路径
      isLocal: isLocalImage(path),  // 是否为本地图片
      fullMatch: match[0],  // 完整匹配的字符串
      index: match.index     // 在原文中的位置
    })
  }

  return images
}

/**
 * 判断图片路径是否为本地图片
 * @param {string} path - 图片路径
 * @returns {boolean} 是否为本地图片
 */
export function isLocalImage(path) {
  if (!path) return false

  // 远程图片（HTTP/HTTPS 协议）
  if (path.startsWith('http://') || path.startsWith('https://')) {
    return false
  }

  // Data URL（base64）
  if (path.startsWith('data:image/')) {
    return false
  }

  // 其他情况都视为本地图片（相对路径、绝对路径、file:// 协议等）
  return true
}

/**
 * 替换 Markdown 中的图片路径
 * @param {string} markdown - 原始 Markdown 内容
 * @param {string} oldPath - 旧的图片路径
 * @param {string} newPath - 新的图片路径（MinIO URL）
 * @returns {string} 替换后的 Markdown 内容
 */
export function replaceImagePath(markdown, oldPath, newPath) {
  if (!markdown || !oldPath || !newPath) return markdown

  // 转义特殊的正则字符，但保留中文和其他 Unicode 字符
  const escapedOldPath = oldPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')

  // 替换图片路径，保持 alt 文本不变
  // 使用全局标志和 Unicode 标志
  const regex = new RegExp(`(!\\[[^\\]]*\\]\\()${escapedOldPath}(\\))`, 'gu')

  let result = markdown.replace(regex, `$1${newPath}$2`)

  // 如果没有替换成功，尝试简单字符串替换（兜底方案）
  if (result === markdown) {
    console.log('正则替换失败，尝试字符串替换')
    result = markdown.split(oldPath).join(newPath)
  }

  return result
}

/**
 * 批量替换 Markdown 中的图片路径
 * @param {string} markdown - 原始 Markdown 内容
 * @param {Array<Object>} replacements - 替换映射数组 [{ oldPath, newPath }]
 * @returns {string} 替换后的 Markdown 内容
 */
export function batchReplaceImagePaths(markdown, replacements) {
  if (!markdown || !replacements || replacements.length === 0) {
    return markdown
  }

  let result = markdown
  replacements.forEach(({ oldPath, newPath }) => {
    result = replaceImagePath(result, oldPath, newPath)
  })

  return result
}

/**
 * 验证文件是否为图片
 * @param {File} file - 文件对象
 * @returns {boolean} 是否为图片
 */
export function isImageFile(file) {
  if (!file) return false

  const imageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/bmp']
  return imageTypes.includes(file.type)
}

/**
 * 验证文件大小
 * @param {File} file - 文件对象
 * @param {number} maxSize - 最大大小（字节），默认 10MB
 * @returns {boolean} 是否符合大小限制
 */
export function validateFileSize(file, maxSize = 10 * 1024 * 1024) {
  if (!file) return false
  return file.size <= maxSize
}

/**
 * 格式化文件大小
 * @param {number} bytes - 文件大小（字节）
 * @returns {string} 格式化后的大小（如：1.5 MB）
 */
export function formatFileSize(bytes) {
  if (bytes === 0) return '0 B'

  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))

  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 从文件路径提取文件名
 * @param {string} path - 文件路径
 * @returns {string} 文件名
 */
export function extractFileName(path) {
  if (!path) return ''

  // 移除查询参数和哈希
  const cleanPath = path.split('?')[0].split('#')[0]

  // 提取最后一个斜杠后的文件名
  const parts = cleanPath.split('/')
  return parts[parts.length - 1] || 'image.png'
}
